import store from '@/store'
import { Message } from 'element-ui'
let WebIM = require('hx-websdk')
WebIM.WebRTC = require('hx-webrtc')

WebIM.config = {
  xmppURL: 'im-api.easemob.com',
  apiURL: (location.protocol === 'https:' ? 'https:' : 'http:') + '//a1.easemob.com',
  appkey: '1124181220222978#abc85410d238d4b5bae2ea3830e3d787',
  https: location.protocol === 'https:',
  isMultiLoginSessions: false,
  isAutoLogin: true,
  isWindowSDK: false,
  isSandBox: false,
  isDebug: false,
  autoReconnectNumMax: 2,
  autoReconnectInterval: 2,
  isWebRTC: (/Firefox/.test(navigator.userAgent) || /WebKit/.test(navigator.userAgent)) && /^https:$/.test(window.location.protocol),
  heartBeatWait: 4500,
  isHttpDNS: false,
  msgStatus: true,
  delivery: true,
  read: false,
  encrypt: {
    type: 'none'
  }
}
WebIM.Emoji = {
  path: '../../assets/faces/',
  map: {
    '[):]': 'ee_1.png',
    '[:D]': 'ee_2.png',
    '[;)]': 'ee_3.png',
    '[:-o]': 'ee_4.png',
    '[:p]': 'ee_5.png',
    '[(H)]': 'ee_6.png',
    '[:@]': 'ee_7.png',
    '[:s]': 'ee_8.png',
    '[:$]': 'ee_9.png',
    '[:(]': 'ee_10.png',
    '[:\'(]': 'ee_11.png',
    '[:|]': 'ee_12.png',
    '[(a)]': 'ee_13.png',
    '[8o|]': 'ee_14.png',
    '[|]': 'ee_15.png',
    '[+o(]': 'ee_16.png',
    '[<o)]': 'ee_17.png',
    '[|-)]': 'ee_18.png',
    '[*-)]': 'ee_19.png',
    '[:-#]': 'ee_20.png',
    '[:-*]': 'ee_21.png',
    '[^o)]': 'ee_22.png',
    '[8-)]': 'ee_23.png',
    '[(|)]': 'ee_24.png',
    '[(u)]': 'ee_25.png',
    '[(S)]': 'ee_26.png',
    '[(*)]': 'ee_27.png',
    '[(#)]': 'ee_28.png',
    '[(R)]': 'ee_29.png',
    '[({)]': 'ee_30.png',
    '[(})]': 'ee_31.png',
    '[(k)]': 'ee_32.png',
    '[(F)]': 'ee_33.png',
    '[(W)]': 'ee_34.png',
    '[(D)]': 'ee_35.png'
  }
}
WebIM.NewEmoji = {
  map: ['😀', '😃', '😄', '😁', '😆', '😅', '🤣', '😂', '🙂', '🙃', '😉', '😊', '😇', '😍', '🤩', '😘', '😗', '😚', '😙', '😋', '😛', '😜', '🤪', '😝', '🤑', '🤗', '🤭', '🤫', '🤔', '🤐', '🤨', '😐', '😑', '😶', '😏', '😒', '🙄', '😬', '🤥', '😌', '😔', '😪', '🤤', '😴', '😷', '🤒', '🤕', '🤢', '🤮', '🤧', '😵', '🤯', '🤠', '😎', '🤓', '🧐', '😕', '😟', '🙁', '☹', '😮', '😯', '😲', '😳', '😦', '😧', '😨', '😰', '😥', '😢', '😭', '😱', '😖', '😣', '😞', '😓', '😩', '😫', '😤', '😡', '😠', '🤬', '😈', '👿', '💀', '☠', '💩', '🤡', '👹', '👺', '👻', '👽', '👾', '🤖', '😺', '😸', '😹', '😻', '😼', '😽', '🙀', '😿', '😾', '💋', '👋', '🤚', '🖐', '✋', '🖖', '👌', '✌', '🤞', '🤟', '🤘', '🤙', '👈', '👉', '👆', '🖕', '👇', '☝', '👍', '👎', '✊', '👊', '🤛', '🤜', '👏', '🙌', '👐', '🤲', '🤝', '🙏', '✍', '💅', '🤳', '💪', '👂', '👃', '🧠', '👀', '👁', '👅', '👄', '👶', '🧒', '👦', '👧', '🧑', '👱', '👨', '🧔', '👱‍', '👨‍', '👨‍', '👨‍', '👨‍', '👩', '👱‍', '👩‍', '👩‍', '👩‍', '👩‍', '🧓', '👴', '👵', '🙍', '🙍‍', '🙍‍', '🙎', '🙎‍', '🙎‍', '🙅', '🙅‍', '🙅‍', '🙆', '🙆‍', '🙆‍', '💁', '💁‍', '💁‍', '🙋', '🙋‍', '🙋‍', '🙇', '🙇‍', '🙇‍', '🤦', '🤦‍', '🤦‍', '🤷', '🤷‍', '🤷‍', '👨‍⚕️', '👩‍⚕️', '👨‍🎓', '👩‍🎓', '👨‍🏫', '👩‍🏫', '👨‍⚖️', '👩‍⚖️', '👨‍🌾', '👩‍🌾', '👨‍🍳', '👩‍🍳', '👨‍🔧', '👩‍🔧', '👨‍🏭', '👩‍🏭', '👨‍💼', '👩‍💼', '👨‍🔬', '👩‍🔬', '👨‍💻', '👩‍💻', '👨‍🎤', '👩‍🎤', '👨‍🎨', '👩‍🎨', '👨‍✈️', '👩‍✈️', '👨‍🚀', '👩‍🚀', '👨‍🚒', '👩‍🚒', '👮', '👮‍♂️', '👮‍♀️', '🕵', '🕵️‍♂️', '🕵️‍♀️', '💂', '💂‍', '💂‍', '👷', '👷‍', '👷‍', '🤴', '👸', '👳', '👳‍', '👳‍', '👲', '🧕', '🤵', '👰', '🤰', '🤱', '👼', '🎅', '🤶', '🧙', '🧙‍', '🧙‍', '🧚', '🧚‍', '🧚‍', '🧛', '🧛‍', '🧛‍', '🧜', '🧜‍', '🧜‍', '🧝', '🧝‍', '🧝‍', '🧞', '🧞‍', '🧞‍', '🧟', '🧟‍', '🧟‍', '💆', '💆‍', '💆‍', '💇', '💇‍', '💇‍', '🚶', '🚶‍', '🚶‍', '🏃', '🏃‍', '🏃‍', '💃', '🕺', '🕴', '👯', '👯‍', '👯‍', '🧖', '🧖‍', '🧖‍', '🧘', '👭', '👫', '👬', '💏', '👨‍', '👩‍', '💑', '👨‍', '👩‍', '👪', '👨‍👩‍👦', '👨‍👩‍👧', '👨‍👩‍👧‍👦', '👨‍👩‍👦‍👦', '👨‍👩‍👧‍👧', '👨‍👨‍👦', '👨‍👨‍👧', '👨‍👨‍👧‍👦', '👨‍👨‍👦‍👦', '👨‍👨‍👧‍👧', '👩‍👩‍👦', '👩‍👩‍👧', '👩‍👩‍👧‍👦', '👩‍👩‍👦‍👦', '👩‍👩‍👧‍👧', '👨‍👦', '👨‍👦‍👦', '👨‍👧', '👨‍👧‍👦', '👨‍👧‍👧', '👩‍👦', '👩‍👦‍👦', '👩‍👧', '👩‍👧‍👦', '👩‍👧‍👧', '🗣', '👤', '👥', '👣', '🌂', '☂', '👓', '🕶', '👔', '👕', '👖', '🧣', '🧤', '🧥', '🧦', '👗', '👘', '👙', '👚', '👛', '👜', '👝', '🎒', '👞', '👟', '👠', '👡', '👢', '👑', '👒', '🎩', '🎓', '🧢', '⛑', '💄', '💍', '💼']
}
/* eslint new-cap: ["error", { "newIsCap": false }] */
const conn = new WebIM.connection({
  isMultiLoginSessions: WebIM.config.isMultiLoginSessions,
  https: WebIM.config.https,
  url: WebIM.config.xmppURL,
  heartBeatWait: WebIM.config.heartBeatWait,
  autoReconnectNumMax: WebIM.config.autoReconnectNumMax,
  autoReconnectInterval: WebIM.config.autoReconnectInterval,
  apiUrl: WebIM.config.apiURL,
  isAutoLogin: true
})
conn.listen({
  onOpened: function (message) { // 连接成功回调
    // 如果isAutoLogin设置为false，那么必须手动设置上线，否则无法收消息
    // 手动上线指的是调用conn.setPresence(); 如果conn初始化时已将isAutoLogin设置为true
    // 则无需调用conn.setPresence();
    Message.success('用户登录成功')
  },
  onClosed: function (message) {}, // 连接关闭回调
  onTextMessage: function (message) {
    console.log(message)
    setMessage(message, 'txt')
  }, // 收到文本消息
  onEmojiMessage: function (message) {}, // 收到表情消息
  onPictureMessage: function (message) {
    console.log(message)
    setMessage(message, 'img')
  }, // 收到图片消息
  onCmdMessage: function (message) {}, // 收到命令消息
  onAudioMessage: function (message) {}, // 收到音频消息
  onLocationMessage: function (message) {}, // 收到位置消息
  onFileMessage: function (message) {
    console.log(message)
    setMessage(message, 'file')
  }, // 收到文件消息
  onVideoMessage: function (message) {
    var node = document.getElementById('privateVideo')
    var option = {
      url: message.url,
      headers: {
        'Accept': 'audio/mp4'
      },
      onFileDownloadComplete: function (response) {
        var objectURL = WebIM.utils.parseDownloadResponse.call(conn, response)
        node.src = objectURL
      },
      onFileDownloadError: function () {
        console.log('File down load error.')
      }
    }
    WebIM.utils.download.call(conn, option)
  }, // 收到视频消息
  onPresence: function (message) {}, // 处理“广播”或“发布-订阅”消息，如联系人订阅请求、处理群组、聊天室被踢解散等消息
  onRoster: function (message) {}, // 处理好友申请
  onInviteMessage: function (message) {}, // 处理群组邀请
  onOnline: function () {}, // 本机网络连接成功
  onOffline: function () {}, // 本机网络掉线
  onError: function (message) {}, // 失败回调
  onBlacklistUpdate: function (list) { // 黑名单变动
    // 查询黑名单，将好友拉黑，将好友从黑名单移除都会回调这个函数，list则是黑名单现有的所有好友信息
    console.log(list)
  },
  onReceivedMessage: function (message) {}, // 收到消息送达服务器回执
  onDeliveredMessage: function (message) {}, // 收到消息送达客户端回执
  onReadMessage: function (message) {}, // 收到消息已读回执
  onCreateGroup: function (message) {}, // 创建群组成功回执（需调用createGroupNew）
  onMutedMessage: function (message) {} // 如果用户在A群组被禁言，在A群发消息会走这个回调并且消息不会传递给群其它成员
})

const rtcCall = new WebIM.WebRTC.Call({
  connection: conn,
  mediaStreamConstaints: {
    audio: true,
    video: true
  },

  listener: {
    onAcceptCall: function (from, options) {
      // console.log('onAcceptCall::', 'from: ', from, 'options: ', options);
    },
    onGotRemoteStream: function (stream, streamType) {
      // console.log('onGotRemoteStream::', 'stream: ', stream, 'streamType: ', streamType);
    },
    onGotLocalStream: function (stream, streamType) {
      // console.log('onGotLocalStream::', 'stream:', stream, 'streamType: ', streamType);
    },
    onRinging: function (caller) {
      // let reg = /(?<=_).*(?=@)/
      // let callerId = (reg.exec(caller))[0]
      // let curUser = []
      // let friends = store.state.data.friends
      // for (let i in friends) {
      //   if (friends[i].username === callerId) {
      //     curUser = friends[i]
      //   }
      // }
      // console.log(curUser)
      // router.push({ path: '/calling', query: { user: curUser, curBtn: true } })
    },
    onTermCall: function (reason) {
      console.log('onTermCall::')
      console.log('reason:', reason)
    },
    onIceConnectionStateChange: function (iceState) {
      if (iceState === 'closed') {
        // router.push({ path: '/friends' })
      }
    },
    onError: function (e) {
      console.log(e)
    }
  }
})

const imOptions = {
  apiUrl: WebIM.config.apiURL,
  user: null,
  pwd: '888888',
  appKey: WebIM.config.appkey
}
// 全局注册WebIM
window.WebIM = WebIM

export default {
  install: function (Vue, options) {
    // console.log(WebIM)
    Object.defineProperty(Vue.prototype, '$WebIM', { value: WebIM })
    Object.defineProperty(Vue.prototype, '$imConn', { value: conn })
    Object.defineProperty(Vue.prototype, '$rtcCall', { value: rtcCall })
    Object.defineProperty(Vue.prototype, '$WebImOptions', { value: imOptions })
  }
}

/* wf_Huang 2019/11/21 0021 接收消息方法处理 */
export function setMessage (message, typ) {
  // 先判断是好友消息还是群聊消息
  if (message.type === 'chat') {
    if (typ === 'img' || typ === 'file') {
      message.type = typ
    }
    let isUserIndex = store.state.imMessage.currentChatterUserList.findIndex((item) => item.name === store.state.imUserList.user.name)
    if (isUserIndex !== -1) {
      store.state.imUserList.userIndex = isUserIndex
      let item = store.state.imMessage.currentChatterUserList[isUserIndex]
      item.chatNumber = true
      // 判断是否存在这个人的聊天消息
      let isMessageIndex = item.list.findIndex((item) => item.from === message.from)
      if (isMessageIndex !== -1) {
        let itemMessage = item.list[isMessageIndex]
        itemMessage.megNumber = itemMessage.megNumber + 1 // 这个人未读消息数量
        if (!message.delay) { // 判断有没有时间字段
          message.delay = new Date()
        }
        message.place = 'L'
        itemMessage.data = message.data // 最新的消息
        itemMessage.delay = message.delay // 最新的消息时间
        itemMessage.list.push(message)
        item.list[isMessageIndex] = itemMessage
      } else {
        if (!message.delay) { // 判断有没有时间字段
          message.delay = new Date()
        }
        item.list.push({
          list: [message],
          from: message.from,
          to: message.to,
          megNumber: 1,
          data: message.data, // 最新的一条消息
          type: message.type
        })
      }
      store.state.imMessage.currentChatterUserList[isUserIndex] = item
    } else {
      store.state.imMessage.currentChatterUserList.push({
        name: store.state.imUserList.user.name,
        friendList: [], // 好友列表
        groupList: [], // 群列表
        openGroupList: [], // 公开群列表
        blackList: [], // 黑名单列表
        chatNumber: false, // 未读好友消息
        groupchatNumber: false, // 未读群聊消息
        grouplist: [], // 群消息
        list: [{
          list: [message],
          from: message.from,
          to: message.to,
          delay: new Date(),
          megNumber: 1,
          type: message.type
        }]
      })
    }
  } else if (message.type === 'groupchat') {
    if (typ === 'img' || typ === 'file') {
      message.type = typ
    }
    let isUserIndex = store.state.imMessage.currentChatterUserList.findIndex((item) => item.name === store.state.imUserList.user.name)
    if (isUserIndex !== -1) {
      store.state.imUserList.userIndex = isUserIndex
      let item = store.state.imMessage.currentChatterUserList[isUserIndex]
      item.groupchatNumber = true
      // 判断是否存在这个群的聊天消息
      let isMessageIndex = item.grouplist.findIndex((item) => item.to === message.to)
      if (isMessageIndex !== -1) {
        let itemMessage = item.grouplist[isMessageIndex]
        itemMessage.megNumber = itemMessage.megNumber + 1 // 这个人未读消息数量
        if (!message.delay) { // 判断有没有时间字段
          message.delay = new Date()
        }
        message.place = 'L'
        itemMessage.data = message.data // 最新的消息
        itemMessage.delay = message.delay // 最新的消息时间
        itemMessage.list.push(message)
        item.grouplist[isMessageIndex] = itemMessage
      } else {
        if (!message.delay) { // 判断有没有时间字段
          message.delay = new Date()
        }
        item.grouplist.push({
          list: [message],
          from: message.from,
          to: message.to,
          megNumber: 1,
          data: message.data, // 最新的一条消息
          type: message.type
        })
      }
      store.state.imMessage.currentChatterUserList[isUserIndex] = item
    } else {
      store.state.imMessage.currentChatterUserList.push({
        name: store.state.imUserList.user.name,
        friendList: [], // 好友列表
        groupList: [], // 群列表
        openGroupList: [], // 公开群列表
        blackList: [], // 黑名单列表
        chatNumber: 0, // 未读好友消息
        groupchatNumber: 0, // 未读群聊消息
        list: [], // 好友消息列表
        grouplist: [{
          list: [message],
          from: message.from,
          to: message.to,
          delay: new Date(),
          megNumber: 1,
          type: message.type
        }]
      })
    }
  }
  // 浏览器存储
  localStorage.setItem('stateData', JSON.stringify(store.state))
}
